/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.graficaluna.ui.pedido;

import com.graficaluna.service.otros.ServicioCliente;
import com.graficaluna.service.pedido.ServicioOrdenTrabajo;
import dto.DetallePedidoDTO;
import dto.OrdenTrabajoDTO;
import dto.PedidoDTO;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;
import com.graficaluna.service.pedido.ServicioPedido;
import dto.ClienteDTO;
import java.io.IOException;
//import dto.DetalleOrdenTrabajoDTO;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author ralf
 */
@ManagedBean(name = "ordenTrabajoBean")
@ViewScoped
public class OrdenTrabajoBean implements Serializable {

    private List<OrdenTrabajoDTO> listaOrdenes;
    private String mensajeExito;
    private OrdenTrabajoDTO orden = new OrdenTrabajoDTO();
    private PedidoDTO pedido = new PedidoDTO();
    //private List<DetalleOrdenTrabajoDTO> lstDetalleOrdenTrabajo = new ArrayList<DetalleOrdenTrabajoDTO>();
    private List<PedidoDTO> lstPedidos = new ArrayList<PedidoDTO>();
    private List<PedidoDTO> lstPedidosSeleccionados = new ArrayList<PedidoDTO>();
    private List<DetallePedidoDTO> lstDetallePedidos = new ArrayList<DetallePedidoDTO>();
    private String cadenaPedidos;
    private boolean mostrarForm;
    private boolean mostrarBotonGrabar;
    private String mensajeSinPedidos;

    public OrdenTrabajoBean() {
        ServicioOrdenTrabajo serv = new ServicioOrdenTrabajo();
        pedido = new PedidoDTO();
        listaOrdenes = serv.listarOrdenesTrabajo();
    }

    public String iniciar() {
        return "/views/orden_de_trabajo/mantOrdenTrabajo.xhtml?faces-redirect=true";//
    }

    public void verFormulario(boolean ver) {
        mostrarForm = ver;
        mostrarBotonGrabar = ver;
    }

    public void editar(OrdenTrabajoDTO orden) {
        try {
            this.cadenaPedidos = "";
            this.orden = new ServicioOrdenTrabajo().obtenerOrdenTrabajo(orden);
            for (PedidoDTO p : this.orden.getLstPedidos()) {
                cadenaPedidos += p.getNumPedido() + ",";

            }
            cadenaPedidos = cadenaPedidos.substring(0, cadenaPedidos.length() - 1);
            verFormulario(true);
        } catch (Exception ex) {
            Logger.getLogger(OrdenTrabajoBean.class.getName()).log(Level.SEVERE, null, ex);
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), null));
        }
    }

    public void anular(OrdenTrabajoDTO orden) {
        try {
            ServicioOrdenTrabajo ord = new ServicioOrdenTrabajo();
            orden.setEstado("An");
            ord.anularOrdenTrabajo(orden);
            listaOrdenes = ord.listarOrdenesTrabajo();
        } catch (Exception ex) {
            Logger.getLogger(OrdenTrabajoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void mostrarDialog() {
        lstPedidos = new ArrayList<PedidoDTO>();
        pedido = new PedidoDTO();
        RequestContext ctx = RequestContext.getCurrentInstance();
        ctx.execute("clientesDialog.show()");
    }

    public void buscarPedidosCliente() {
        ServicioCliente sc = new ServicioCliente();
        ServicioPedido servicio = new ServicioPedido();
        ClienteDTO cliente = sc.buscarClientesPorFiltro(orden.getDescCliente().toUpperCase()).get(0);
        pedido.setCodigoCliente(cliente.getIdCliente());
        this.orden.setDescCliente(cliente.getDescripcion().toUpperCase());
        this.orden.setCodigoCliente(cliente.getIdCliente());
        pedido.setEstado("P");
        lstPedidos = servicio.listarPedidosCliente(pedido);
        if (lstPedidos.isEmpty()) {
            mensajeSinPedidos = "No existen pedidos pagados del cliente " + orden.getDescCliente();
        }
    }

    public void seleccionarPedidosCliente() {
        cadenaPedidos = "";
        for (PedidoDTO p : lstPedidos) {
            if (p.isSelected()) {
                cadenaPedidos += p.getNumPedido() + ",";
            }
        }
        if (!cadenaPedidos.isEmpty()) {
            cadenaPedidos = cadenaPedidos.substring(0, cadenaPedidos.length() - 1);
            RequestContext ctx = RequestContext.getCurrentInstance();
            ctx.execute("clientesDialog.hide()");
        } else {

        }
        buscarDetallePedidos();
    }

    public void buscarDetallePedidos() {
        ServicioPedido serv = new ServicioPedido();
        orden.getLstPedidos().clear();
        PedidoDTO pedido;
        for (String ids : cadenaPedidos.split(",")) {
            pedido = new PedidoDTO();
            pedido.setNumPedido(new Long(ids.trim()));
            pedido = serv.obtenerPedido(pedido);
            orden.getLstPedidos().add(pedido);
        }
    }

    public void grabar() {
        try {
            mostrarBotonGrabar = false;
            ServicioOrdenTrabajo sp = new ServicioOrdenTrabajo();
            this.orden.setEstado("P");
            this.orden.setTieneMaquinas(false);
            sp.grabar(orden);
            FacesContext.getCurrentInstance().addMessage("messages",
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                            "se grabo correctamente la orden nro. " + orden.getCodigo(),
                            null));
        } catch (Exception ex) {
            Logger.getLogger(OrdenTrabajoBean.class.getName()).log(Level.SEVERE, null, ex);
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), null));
        }
    }

    public void descargarArte(DetallePedidoDTO pedido) {
        ServletOutputStream ouputStream = null;
        FacesContext ctx = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
        try {
            byte[] bytes = pedido.getArchivo();
            response.setContentType("application/pdf");
            response.setContentLength(bytes.length);
            response.setHeader("Content-Disposition", "atachment; filename=\"*.pdf\"");
            ouputStream = response.getOutputStream();
            ouputStream.write(bytes, 0, bytes.length);
        } catch (IOException ex) {
            Logger.getLogger(OrdenTrabajoBean.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                ctx.responseComplete();
                ouputStream.close();
            } catch (IOException ex) {
                Logger.getLogger(OrdenTrabajoBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    //<editor-fold defaultstate="collapsed" desc="setters and getters">
    /**
     * @return the listaOrdenes
     */
    public List<OrdenTrabajoDTO> getListaOrdenes() {
        return listaOrdenes;
    }

    /**
     * @param listaOrdenes the listaOrdenes to set
     */
    public void setListaOrdenes(List<OrdenTrabajoDTO> listaOrdenes) {
        this.listaOrdenes = listaOrdenes;
    }

    /**
     * @return the mensajeExito
     */
    public String getMensajeExito() {
        return mensajeExito;
    }

    /**
     * @param mensajeExito the mensajeExito to set
     */
    public void setMensajeExito(String mensajeExito) {
        this.mensajeExito = mensajeExito;
    }

    /**
     * @return the orden
     */
    public OrdenTrabajoDTO getOrden() {
        return orden;
    }

    /**
     * @param orden the orden to set
     */
    public void setOrden(OrdenTrabajoDTO orden) {
        this.orden = orden;
    }

    /**
     * @return the mostrarForm
     */
    public boolean isMostrarForm() {
        return mostrarForm;
    }

    /**
     * @param mostrarForm the mostrarForm to set
     */
    public void setMostrarForm(boolean mostrarForm) {
        this.mostrarForm = mostrarForm;
    }

    //</editor-fold>
    /**
     * @return the pedido
     */
    public PedidoDTO getPedido() {
        return pedido;
    }

    /**
     * @param pedido the pedido to set
     */
    public void setPedido(PedidoDTO pedido) {
        this.pedido = pedido;
    }

    /**
     * @return the lstPedidos
     */
    public List<PedidoDTO> getLstPedidos() {
        return lstPedidos;
    }

    /**
     * @param lstPedidos the lstPedidos to set
     */
    public void setLstPedidos(List<PedidoDTO> lstPedidos) {
        this.lstPedidos = lstPedidos;
    }

    /**
     * @return the lstPedidosSeleccionados
     */
    public List<PedidoDTO> getLstPedidosSeleccionados() {
        return lstPedidosSeleccionados;
    }

    /**
     * @param lstPedidosSeleccionados the lstPedidosSeleccionados to set
     */
    public void setLstPedidosSeleccionados(List<PedidoDTO> lstPedidosSeleccionados) {
        this.lstPedidosSeleccionados = lstPedidosSeleccionados;
    }

    /**
     * @return the cadenaPedidos
     */
    public String getCadenaPedidos() {
        return cadenaPedidos;
    }

    /**
     * @param cadenaPedidos the cadenaPedidos to set
     */
    public void setCadenaPedidos(String cadenaPedidos) {
        this.cadenaPedidos = cadenaPedidos;
    }

    /**
     * @return the lstDetallePedidos
     */
    public List<DetallePedidoDTO> getLstDetallePedidos() {
        return lstDetallePedidos;
    }

    /**
     * @param lstDetallePedidos the lstDetallePedidos to set
     */
    public void setLstDetallePedidos(List<DetallePedidoDTO> lstDetallePedidos) {
        this.lstDetallePedidos = lstDetallePedidos;
    }

    /**
     * @return the mostrarBotonGrabar
     */
    public boolean isMostrarBotonGrabar() {
        return mostrarBotonGrabar;
    }

    /**
     * @param mostrarBotonGrabar the mostrarBotonGrabar to set
     */
    public void setMostrarBotonGrabar(boolean mostrarBotonGrabar) {
        this.mostrarBotonGrabar = mostrarBotonGrabar;
    }

    /**
     * @return the mensaje
     */
    public String getMensajeSinPedidos() {
        return mensajeSinPedidos;
    }

    /**
     * @param mensaje the mensaje to set
     */
    public void setMensajeSinPedidos(String mensaje) {
        this.mensajeSinPedidos = mensaje;
    }

}
